package app

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

type Response struct {
	Ctx *gin.Context
}

// 返回的参数
type R struct {
	Code int         `json:"code"` // 返回标记：成功标记=0，失败标记=1
	Msg  []string    `json:"msg"`  // 返回信息
	Data interface{} `json:"data"` // 返回数据
}

// 实际修改默认参数的函数
type ModifyR func(r *R)

// 设置返回消息
func WithMsg(messages ...string) ModifyR {
	var ms []string
	for _, message := range messages {
		ms = append(ms, message)
	}
	return func(r *R) {
		r.Msg = ms
	}
}

// 设置返回数据
func WithData(data interface{}) ModifyR {
	return func(r *R) {
		r.Data = data
	}
}

// 修改默认值
func operateR(code int, modifyR ...ModifyR) *R {
	// 设置默认值
	r := &R{
		Code: code,
		Msg:  []string{},
		Data: map[string]interface{}{},
	}
	for _, fun := range modifyR {
		fun(r)
	}
	return r
}

// 返回成功
func (r *Response) Ok(modifyR ...ModifyR) {
	r.Ctx.JSON(http.StatusOK, operateR(0, modifyR...))
}

// 返回失败
func (r *Response) Fail(modifyR ...ModifyR) {
	r.Ctx.JSON(http.StatusOK, operateR(1, modifyR...))
}

// 返回自定义格式
func (r *Response) Resp(code int, modifyR ...ModifyR) {
	r.Ctx.JSON(http.StatusOK, operateR(code, modifyR...))
}

// 分页信息
type Pager struct {
	PageIndex int `json:"pageIndex"`
	PageSize  int `json:"pageSize"`
	TotalRows int `json:"totalRows"`
}

// 分页信息
type PageList struct {
	List interface{} `json:"list"`
	Pager
}

// 返回列表
func ToPageList(pager Pager, list interface{}) *PageList {
	p := PageList{
		List:  list,
		Pager: pager,
	}
	return &p
}

// 列表信息
type List struct {
	List interface{} `json:"list"`
}

// 返回列表
func ToList(list interface{}) *List {
	l := List{
		List: list,
	}
	return &l
}

// 详情信息
type Detail struct {
	Detail interface{} `json:"detail"`
}

func ToDetail(detail interface{}) *Detail {
	return &Detail{Detail: detail}
}

type Id struct {
	Id string `json:"id"`
}

func ToId(id string) Id {
	return Id{Id: id}
}

func NewResponse(ctx *gin.Context) *Response {
	return &Response{Ctx: ctx}
}
